;#####################   TITULO DO SEU CODIGO FONTE   #######################
;#                                                                          #
;#        Rotina de delay (atraso) de 1s utilizando apenas instrucoes       #
;#        usado para um circuito de pisca led                               #
;############################################################################

;-----------------------DIRETIVAS AO COMPILADOR------------------------------

    LIST      P=16F84A
    RADIX      DEC
    INCLUDE      <P16F84A.INC>
    __CONFIG  _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON


;-------------------VARIAVEIS E EQUIVALENCIAS---------------------------------


x        equ    0ch    ;variavel auxiliar no delay
milisegundo    equ    0dh    ;variavel auxiliar no delay
seg        equ    0é    ;variavel auxiliar no delay

;--------------------INICIALIZAÇÃO DO PROGRAMA---------------------------------

    clrf     portb         ; Faz todos os bits de portb = zer0
    bsf     status,rp0     ; vai para o banco 1 da RAM
    clrf     trisb         ; Faz portb todo saida
    bcf     status,rp0     ; volta ao banco 0 da RAM

;--------------------PROGRAMA PRINCIPAL-----------------------------------------

repete
    bsf     portb,7     ; Faz bit 7 do portb=1 (apaga o LED)
    call    s1        ; Chama a subrotina s1 (nosso delay de 1s)
    bcf     portb,7     ; Faz bit 7 do portb=0 ( acende o Led}
    call    s1        ; Chama a subrotina s1 (nosso delay de 1s)
    goto     repete         ; Vai para o label repete

;-------------------------------- SUB ROTINAS ---------------------------------

;----- inicio da rotina de 1 segundo

s1
    movlw   10
    movwf    seg        ; Até aqui incluindo o call gastaram-se 4 us.

ms100
    movlw   100        ; 1 us Carrega milisegundo com 100
    movwf    milisegundo    ; 1 us

ms1
    movlw    249        ; carrega x com o valor 249 (decimal)
    movwf    x        ; 2 us ( 1 do movlw e 1 do movwf )
ms2
    nop            ; + 1 us
    decfsz    x        ; + 1 us (no último é 2 e pula p/ decfsz seg)
    goto    ms2        ; + 2 us, total 4us.(no último não passa aqui)
                ; (4 us x 249)-1  totaliza 995 us
    decfsz    milisegundo    ; +1 us (na última pasagem 2 us)
    goto    ms1        ; +2 us (na última passagem pula)
                ; total ms1 (1000 x 100)-1 = 99999
    decfsz    seg        ; + 1 us (no último é 2 e pula p/ return)
    goto    ms100        ; +2 us (na última passagem pula)

                ; Total antes do return: 4us (inicio) +10 X 100004
                ; {(1 do movlw100 + 1 do movwf milisegundo + 99999 da
                ; rotina ms1 + 1 do decfsz seg + 2 do goto)}- 1 da
                ; última passagem Total = 1000043 us
    return            ; + 2 us retorna da sub-rotina apos 1.000.045 us
                ; aproximadamente 1 segundo
;-----fim da rotina de 1 segundo

;----------------------------- fim do programa ----------------------------------
    end

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
